﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ACLibs.WinAPI
{
    public partial class User32
    {
        #region API常量(枚举):Constants

        /// <summary>
        /// 显示窗口类型
        /// </summary>
        [Flags]
        public enum ShowWindowCommands
        {
            /// <summary>
            /// 最小化一个窗口，即使拥有该窗口的线程没有响应。 仅当最小化来自其他线程的窗口时，才应使用此标志。
            /// </summary>
            SW_FORCEMINIMIZE = 11,

            /// <summary>
            /// 隐藏该窗口并激活另一个窗口。
            /// </summary>
            SW_HIDE = 0,

            /// <summary>
            /// 最大化指定的窗口。
            /// </summary>
            SW_MAXIMIZE = 3,

            /// <summary>
            /// 最小化指定的窗口并以Z顺序激活下一个顶级窗口。
            /// </summary>
            SW_MINIMIZE = 6,

            /// <summary>
            /// 激活并显示窗口。如果窗口最小化或最大化，则系统会将其还原到其原始大小和位置。恢复最小化窗口时，应用程序应指定此标志。
            /// </summary>
            SW_RESTORE = 9,

            /// <summary>
            /// 激活窗口并以其当前大小和位置显示它。
            /// </summary>
            SW_SHOW = 5,

            /// <summary>
            /// 根据启动应用程序的程序传递给CreateProcess函数的STARTUPINFO结构中指定的SW_值设置显示状态。
            /// </summary>
            SW_SHOWDEFAULT = 10,

            /// <summary>
            /// 激活窗口并将其显示为最大化窗口。
            /// </summary>
            SW_SHOWMAXIMIZED = 3,

            /// <summary>
            /// 激活窗口并将其显示为最小化窗口。
            /// </summary>
            SW_SHOWMINIMIZED = 2,

            /// <summary>
            /// 将窗口显示为最小化窗口。该值类似于SW_SHOWMINIMIZED，除了未激活窗口。
            /// </summary>
            SW_SHOWMINNOACTIVE = 7,

            /// <summary>
            /// 以当前大小和位置显示窗口。该值与SW_SHOW相似，不同之处在于未激活窗口。
            /// </summary>
            SW_SHOWNA = 8,

            /// <summary>
            /// 显示窗口的最新大小和位置。该值与SW_SHOWNORMAL相似，不同之处在于未激活窗口。
            /// </summary>
            SW_SHOWNOACTIVATE = 4,

            /// <summary>
            /// 激活并显示一个窗口。如果窗口最小化或最大化，则系统会将其还原到其原始大小和位置。首次显示窗口时，应用程序应指定此标志。
            /// </summary>
            SW_SHOWNORMAL = 1
        }

        /// <summary>
        /// 窗口标志
        /// </summary>
        [Flags]
        public enum WindowLongFlags
        {
            /// <summary>
            /// 检索扩展的窗口样式。
            /// </summary>
            GWL_EXSTYLE = -20,

            /// <summary>
            /// 检索应用程序实例的句柄。
            /// </summary>
            GWLP_HINSTANCE = -6,

            /// <summary>
            /// 检索父窗口的句柄（如果有）。
            /// </summary>
            GWLP_HWNDPARENT = -8,

            /// <summary>
            /// 检索窗口的标识符。
            /// </summary>
            GWLP_ID = -12,

            /// <summary>
            /// 检索窗口样式。
            /// </summary>
            GWL_STYLE = -16,

            /// <summary>
            /// 检索与窗口关联的用户数据。该数据供创建该窗口的应用程序使用。其值最初为零。
            /// </summary>
            GWLP_USERDATA = -21,

            /// <summary>
            /// 检索窗口过程的地址，或代表窗口过程的地址的句柄。您必须使用CallWindowProc函数来调用窗口过程。
            /// </summary>
            GWLP_WNDPROC = -4,

            /// <summary>
            /// 检索对话框过程的地址，或代表对话框过程的地址的句柄。您必须使用CallWindowProc函数来调用对话框过程。
            /// 注意:值应为 DWLP_MSGRESULT + sizeof（LRESULT）
            /// </summary>
            DWLP_DLGPROC = 0x4,

            /// <summary>
            /// 检索在对话框过程中处理的消息的返回值。
            /// </summary>
            DWLP_MSGRESULT = 0,

            /// <summary>
            /// 检索应用程序专用的额外信息，例如句柄或指针。
            /// 注意:值应为 DWLP_DLGPROC + sizeof(DLGPROC)
            /// </summary>
            DWLP_USER = 0x8
        }

        /// <summary>
        /// 窗口样式
        /// </summary>
        [Flags]
        public enum WindowStyles
        {
            /// <summary>
            ///     The window has a thin-line border.
            /// </summary>
            WS_BORDER = 0x00800000,

            /// <summary>
            ///     The window has a title bar (includes the WS_BORDER style).
            /// </summary>
            WS_CAPTION = 0x00C00000,

            /// <summary>
            ///     The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the
            ///     WS_POPUP style.
            /// </summary>
            WS_CHILD = 0x40000000,

            /// <summary>
            ///     Same as the WS_CHILD style.
            /// </summary>
            WS_CHILDWINDOW = 0x40000000,

            /// <summary>
            ///     Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when
            ///     creating the parent window.
            /// </summary>
            WS_CLIPCHILDREN = 0x02000000,

            /// <summary>
            ///     Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message,
            ///     the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be
            ///     updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the
            ///     client area of a child window, to draw within the client area of a neighboring child window.
            /// </summary>
            WS_CLIPSIBLINGS = 0x04000000,

            /// <summary>
            ///     The window is initially disabled. A disabled window cannot receive input from the user. To change this after a
            ///     window has been created, use the EnableWindow function.
            /// </summary>
            WS_DISABLED = 0x08000000,

            /// <summary>
            ///     The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title
            ///     bar.
            /// </summary>
            WS_DLGFRAME = 0x00400000,

            /// <summary>
            ///     The window is the first control of a group of controls. The group consists of this first control and all controls
            ///     defined after it, up to the next control with the WS_GROUP style. The first control in each group usually has the
            ///     WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus
            ///     from one control in the group to the next control in the group by using the direction keys.
            ///     You can turn this style on and off to change dialog box navigation. To change this style after a window has been
            ///     created, use the SetWindowLong function.
            /// </summary>
            WS_GROUP = 0x00020000,

            /// <summary>
            ///     The window has a horizontal scroll bar.
            /// </summary>
            WS_HSCROLL = 0x00100000,

            /// <summary>
            ///     The window is initially minimized. Same as the WS_MINIMIZE style.
            /// </summary>
            WS_ICONIC = 0x20000000,

            /// <summary>
            ///     The window is initially maximized.
            /// </summary>
            WS_MAXIMIZE = 0x01000000,

            /// <summary>
            ///     The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must
            ///     also be specified.
            /// </summary>
            WS_MAXIMIZEBOX = 0x00010000,

            /// <summary>
            ///     The window is initially minimized. Same as the WS_ICONIC style.
            /// </summary>
            WS_MINIMIZE = 0x20000000,

            /// <summary>
            ///     The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must
            ///     also be specified.
            /// </summary>
            WS_MINIMIZEBOX = 0x00020000,

            /// <summary>
            ///     The window is an overlapped window. An overlapped window has a title bar and a border. Same as the WS_TILED style.
            /// </summary>
            WS_OVERLAPPED = 0x00000000,

            /// <summary>
            ///     The window is an overlapped window. Same as the WS_TILEDWINDOW style.
            /// </summary>
            WS_OVERLAPPEDWINDOW =
                WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,

            /// <summary>
            ///     The windows is a pop-up window. This style cannot be used with the WS_CHILD style.
            /// </summary>
            WS_POPUP = unchecked((int)0x80000000),

            /// <summary>
            ///     The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu
            ///     visible.
            /// </summary>
            WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU,

            /// <summary>
            ///     The window has a sizing border. Same as the WS_THICKFRAME style.
            /// </summary>
            WS_SIZEBOX = 0x00040000,

            /// <summary>
            ///     The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
            /// </summary>
            WS_SYSMENU = 0x00080000,

            /// <summary>
            ///     The window is a control that can receive the keyboard focus when the user presses the TAB key. Pressing the TAB key
            ///     changes the keyboard focus to the next control with the WS_TABSTOP style.
            ///     You can turn this style on and off to change dialog box navigation. To change this style after a window has been
            ///     created, use the SetWindowLong function. For user-created windows and modeless dialogs to work with tab stops,
            ///     alter the message loop to call the IsDialogMessage function.
            /// </summary>
            WS_TABSTOP = 0x00010000,

            /// <summary>
            ///     The window has a sizing border. Same as the WS_SIZEBOX style.
            /// </summary>
            WS_THICKFRAME = 0x00040000,

            /// <summary>
            ///     The window is an overlapped window. An overlapped window has a title bar and a border. Same as the WS_OVERLAPPED
            ///     style.
            /// </summary>
            WS_TILED = 0x00000000,

            /// <summary>
            ///     The window is  an overlapped window. Same as the WS_OVERLAPPEDWINDOW style.
            /// </summary>
            WS_TILEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,

            /// <summary>
            ///     The window is initially visible.
            ///     This style can be turned on and off by using the ShowWindow or SetWindowPos function.
            /// </summary>
            WS_VISIBLE = 0x10000000,

            /// <summary>
            ///     The window has a vertical scroll bar.
            /// </summary>
            WS_VSCROLL = 0x00200000
        }

        /// <summary>
        /// 窗口扩展样式
        /// </summary>
        [Flags]
        public enum WindowExStyles
        {
            /// <summary>
            /// 该窗口接受拖放文件。
            /// </summary>
            WS_EX_ACCEPTFILES = 0x00000010,

            /// <summary>
            /// 可见时将顶级窗口强制到任务栏上。
            /// </summary>
            WS_EX_APPWINDOW = 0x00040000,

            /// <summary>
            /// 窗口的边框带有凹陷的边缘。
            /// </summary>
            WS_EX_CLIENTEDGE = 0x00000200,

            /// <summary>
            /// 使用双缓冲按从下到上的绘制顺序绘制窗口的所有后代。
            /// 如果窗口的类样式为CS_OWNDC或CS_CLASSDC，则不能使用此方法。 Windows 2000：不支持此样式。
            /// </summary>
            WS_EX_COMPOSITED = 0x02000000,

            /// <summary>
            ///     The title bar of the window includes a question mark. When the user clicks the question mark, the cursor changes to
            ///     a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The
            ///     child window should pass the message to the parent window procedure, which should call the WinHelp function using
            ///     the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child
            ///     window.
            ///     WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
            /// </summary>
            WS_EX_CONTEXTHELP = 0x00000400,

            /// <summary>
            ///     The window itself contains child windows that should take part in dialog box navigation. If this style is
            ///     specified, the dialog manager recurses into children of this window when performing navigation operations such as
            ///     handling the TAB key, an arrow key, or a keyboard mnemonic.
            /// </summary>
            WS_EX_CONTROLPARENT = 0x00010000,

            /// <summary>
            ///     The window has a double border; the window can, optionally, be created with a title bar by specifying the
            ///     WS_CAPTION style in the dwStyle parameter.
            /// </summary>
            WS_EX_DLGMODALFRAME = 0x00000001,

            /// <summary>
            ///     The window is a layered window. This style cannot be used if the window has a class style of either CS_OWNDC or
            ///     CS_CLASSDC.
            ///     Windows 8:  The WS_EX_LAYERED style is supported for top-level windows and child windows. Previous Windows versions
            ///     support WS_EX_LAYERED only for top-level windows.
            /// </summary>
            WS_EX_LAYERED = 0x00080000,

            /// <summary>
            ///     If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the horizontal
            ///     origin of the window is on the right edge. Increasing horizontal values advance to the left.
            /// </summary>
            WS_EX_LAYOUTRTL = 0x00400000,

            /// <summary>
            /// 该窗口具有通用的左对齐属性。 这是默认值。
            /// </summary>
            WS_EX_LEFT = 0x00000000,

            /// <summary>
            /// 如果外壳语言是希伯来语，阿拉伯语或其他支持阅读顺序对齐的语言，则垂直滚动条（如果有）位于客户区域的左侧。 对于其他语言，样式将被忽略。
            /// </summary>
            WS_EX_LEFTSCROLLBAR = 0x00004000,

            /// <summary>
            /// 使用从左到右的阅读顺序属性显示窗口文本。 这是默认值。
            /// </summary>
            WS_EX_LTRREADING = 0x00000000,

            /// <summary>
            /// 该窗口是MDI子窗口。
            /// </summary>
            WS_EX_MDICHILD = 0x00000040,

            /// <summary>
            /// 当用户单击它时，以这种样式创建的顶级窗口不会成为前台窗口。 当用户最小化或关闭前景窗口时，系统不会将此窗口置于前景。 
            /// 要激活该窗口，请使用SetActiveWindow或SetForegroundWindow函数。
            /// 默认情况下，该窗口不显示在任务栏上。 要强制窗口显示在任务栏上，请使用WS_EX_APPWINDOW样式。
            /// </summary>
            WS_EX_NOACTIVATE = 0x08000000,

            /// <summary>
            /// 该窗口不会将其窗口布局传递给其子窗口。
            /// </summary>
            WS_EX_NOINHERITLAYOUT = 0x00100000,

            /// <summary>
            /// 使用此样式创建的子窗口在创建或销毁时不会将WM_PARENTNOTIFY消息发送到其父窗口。
            /// </summary>
            WS_EX_NOPARENTNOTIFY = 0x00000004,

            /// <summary>
            ///     The window does not render to a redirection surface. This is for windows that do not have visible content or that
            ///     use mechanisms other than surfaces to provide their visual.
            /// </summary>
            WS_EX_NOREDIRECTIONBITMAP = 0x00200000,

            /// <summary>
            ///     The window is an overlapped window.
            /// </summary>
            WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,

            /// <summary>
            ///     The window is palette window, which is a modeless dialog box that presents an array of commands.
            /// </summary>
            WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST,

            /// <summary>
            ///     The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only
            ///     if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the
            ///     style is ignored.
            ///     Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT
            ///     style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON
            ///     styles.
            /// </summary>
            WS_EX_RIGHT = 0x00001000,

            /// <summary>
            /// 垂直滚动条（如果有）在客户区域的右侧。 这是默认值。
            /// </summary>
            WS_EX_RIGHTSCROLLBAR = 0x00000000,

            /// <summary>
            /// 如果外壳语言是希伯来语，阿拉伯语或其他支持阅读顺序对齐的语言，则使用从右到左的阅读顺序属性显示窗口文本。 对于其他语言，样式将被忽略。
            /// </summary>
            WS_EX_RTLREADING = 0x00002000,

            /// <summary>
            /// 该窗口具有三维边框样式，旨在用于不接受用户输入的项目。
            /// </summary>
            WS_EX_STATICEDGE = 0x00020000,

            /// <summary>
            /// 该窗口旨在用作浮动工具栏。 工具窗口的标题栏比普通标题栏短，并且窗口标题使用较小的字体绘制。 
            /// 当用户按下ALT + TAB时，工具窗口不会出现在任务栏或对话框中。
            /// 如果工具窗口具有系统菜单，则其图标不会显示在标题栏上。 
            /// 但是，您可以通过右键单击或键入ALT + SPACE来显示系统菜单。
            /// </summary>
            WS_EX_TOOLWINDOW = 0x00000080,

            /// <summary>
            /// 该窗口应放置在所有非最上面的窗口之上，并且即使在停用该窗口的情况下也应保持在它们之上。 若要添加或删除此样式，请使用SetWindowPos函数。
            /// </summary>
            WS_EX_TOPMOST = 0x00000008,

            /// <summary>
            /// 在绘制窗口下方的兄弟姐妹（由同一线程创建）之前，不应绘制窗口。 
            /// 该窗口显示为透明，因为基础同级窗口的位已被绘制。 要获得透明性而没有这些限制，请使用SetWindowRgn函数。
            /// </summary>
            WS_EX_TRANSPARENT = 0x00000020,

            /// <summary>
            /// 窗口的边框带有凸起的边缘。
            /// </summary>
            WS_EX_WINDOWEDGE = 0x00000100
        }

        /// <summary>
        /// 窗口位置标志
        /// </summary>
        [Flags]
        public enum WindowPositionFlags
        {
            /// <summary>
            ///     If the calling thread and the thread that owns the window are attached to different input queues, the system posts
            ///     the request to the thread that owns the window. This prevents the calling thread from blocking its execution while
            ///     other threads process the request.
            /// </summary>
            SWP_ASYNCWINDOWPOS = 0x4000,

            /// <summary>
            ///     Prevents generation of the WM_SYNCPAINT message.
            /// </summary>
            SWP_DEFERERASE = 0x2000,

            /// <summary>
            ///     Draws a frame (defined in the window's class description) around the window.
            /// </summary>
            SWP_DRAWFRAME = 0x0020,

            /// <summary>
            ///     Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to the window, even if
            ///     the window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE is sent only when the window's
            ///     size is being changed.
            /// </summary>
            SWP_FRAMECHANGED = 0x0020,

            /// <summary>
            ///     Hides the window.
            /// </summary>
            SWP_HIDEWINDOW = 0x0080,

            /// <summary>
            ///     Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the
            ///     topmost or non-topmost group (depending on the setting of the hWndInsertAfter parameter).
            /// </summary>
            SWP_NOACTIVATE = 0x0010,

            /// <summary>
            ///     Discards the entire contents of the client area. If this flag is not specified, the valid contents of the client
            ///     area are saved and copied back into the client area after the window is sized or repositioned.
            /// </summary>
            SWP_NOCOPYBITS = 0x0100,

            /// <summary>
            ///     Retains the current position (ignores X and Y parameters).
            /// </summary>
            SWP_NOMOVE = 0x0002,

            /// <summary>
            ///     Does not change the owner window's position in the Z order.
            /// </summary>
            SWP_NOOWNERZORDER = 0x0200,

            /// <summary>
            ///     Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to the client area,
            ///     the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a
            ///     result of the window being moved. When this flag is set, the application must explicitly invalidate or redraw any
            ///     parts of the window and parent window that need redrawing.
            /// </summary>
            SWP_NOREDRAW = 0x0008,

            /// <summary>
            ///     Same as the SWP_NOOWNERZORDER flag.
            /// </summary>
            SWP_NOREPOSITION = 0x0200,

            /// <summary>
            ///     Prevents the window from receiving the WM_WINDOWPOSCHANGING message.
            /// </summary>
            SWP_NOSENDCHANGING = 0x0400,

            /// <summary>
            ///     Retains the current size (ignores the cx and cy parameters).
            /// </summary>
            SWP_NOSIZE = 0x0001,

            /// <summary>
            ///     Retains the current Z order (ignores the hWndInsertAfter parameter).
            /// </summary>
            SWP_NOZORDER = 0x0004,

            /// <summary>
            ///     Displays the window.
            /// </summary>
            SWP_SHOWWINDOW = 0x0040
        }

        /// <summary>
        /// 窗口Z轴标志
        /// </summary>
        public enum HwndZOrder
        {
            /// <summary>
            ///     Places the window at the bottom of the Z order. If the hWnd parameter identifies a topmost window, the window loses
            ///     its topmost status and is placed at the bottom of all other windows.
            /// </summary>
            HWND_BOTTOM = 1,

            /// <summary>
            ///     Places the window above all non-topmost windows (that is, behind all topmost windows). This flag has no effect if
            ///     the window is already a non-topmost window.
            /// </summary>
            HWND_NOTOPMOST = -2,

            /// <summary>
            ///     Places the window at the top of the Z order.
            /// </summary>
            HWND_TOP = 0,

            /// <summary>
            ///     Places the window above all non-topmost windows. The window maintains its topmost position even when it is
            ///     deactivated.
            /// </summary>
            HWND_TOPMOST = -1
        }

        [Flags]
        public enum KeyModifierFlags
        {
            /// <summary>
            ///     Either ALT key must be held down.
            /// </summary>
            MOD_ALT = 0x0001,

            /// <summary>
            ///     Either CTRL key must be held down.
            /// </summary>
            MOD_CONTROL = 0x0002,

            /// <summary>
            ///     Changes the hotkey behavior so that the keyboard auto-repeat does not yield multiple hotkey notifications.
            ///     Windows Vista:  This flag is not supported.
            /// </summary>
            MOD_NOREPEAT = 0x4000,

            /// <summary>
            ///     Either SHIFT key must be held down.
            /// </summary>
            MOD_SHIFT = 0x0004,

            /// <summary>
            ///     Either WINDOWS key was held down. These keys are labeled with the Windows logo. Keyboard shortcuts that involve the
            ///     WINDOWS key are reserved for use by the operating system.
            /// </summary>
            MOD_WIN = 0x0008
        }

        [Flags]
        public enum MouseInputKeyStateFlags
        {
            /// <summary>
            ///     The CTRL key is down.
            /// </summary>
            MK_CONTROL = 0x0008,

            /// <summary>
            ///     The left mouse button is down.
            /// </summary>
            MK_LBUTTON = 0x0001,

            /// <summary>
            ///     The middle mouse button is down.
            /// </summary>
            MK_MBUTTON = 0x0010,

            /// <summary>
            ///     The right mouse button is down.
            /// </summary>
            MK_RBUTTON = 0x0002,

            /// <summary>
            ///     The SHIFT key is down.
            /// </summary>
            MK_SHIFT = 0x0004,

            /// <summary>
            ///     The first X button is down.
            /// </summary>
            MK_XBUTTON1 = 0x0020,

            /// <summary>
            ///     The second X button is down.
            /// </summary>
            MK_XBUTTON2 = 0x0040
        }

        [Flags]
        public enum HotKeyInputState
        {
            /// <summary>
            ///     Either ALT key was held down.
            /// </summary>
            MOD_ALT = 0x0001,

            /// <summary>
            ///     Either CTRL key was held down.
            /// </summary>
            MOD_CONTROL = 0x0002,

            /// <summary>
            ///     Either SHIFT key was held down.
            /// </summary>
            MOD_SHIFT = 0x0004,

            /// <summary>
            ///     Either WINDOWS key was held down. These keys are labeled with the Windows logo. Hotkeys that involve the Windows
            ///     key are reserved for use by the operating system.
            /// </summary>
            MOD_WIN = 0x0008
        }

        [Flags]
        public enum MouseInputXButtonFlag
        {
            /// <summary>
            ///     The first X button was clicked.
            /// </summary>
            XBUTTON1 = 0x0001,

            /// <summary>
            ///     The second X button was clicked.
            /// </summary>
            XBUTTON2 = 0x0002
        }

        [Flags]
        public enum MouseInputFlags
        {
            /// <summary>
            ///     The dx and dy members contain normalized absolute coordinates. If the flag is not set, dxand dy contain relative
            ///     data (the change in position since the last reported position). This flag can be set, or not set, regardless of
            ///     what kind of mouse or other pointing device, if any, is connected to the system. For further information about
            ///     relative mouse motion, see the following Remarks section.
            /// </summary>
            MOUSEEVENTF_ABSOLUTE = 0x8000,

            /// <summary>
            ///     The wheel was moved horizontally, if the mouse has a wheel. The amount of movement is specified in mouseData.
            ///     Windows XP/2000:  This value is not supported.
            /// </summary>
            MOUSEEVENTF_HWHEEL = 0x01000,

            /// <summary>
            ///     Movement occurred.
            /// </summary>
            MOUSEEVENTF_MOVE = 0x0001,

            /// <summary>
            ///     The WM_MOUSEMOVE messages will not be coalesced. The default behavior is to coalesce WM_MOUSEMOVE messages.
            ///     Windows XP/2000:  This value is not supported.
            /// </summary>
            MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000,

            /// <summary>
            ///     The left button was pressed.
            /// </summary>
            MOUSEEVENTF_LEFTDOWN = 0x0002,

            /// <summary>
            ///     The left button was released.
            /// </summary>
            MOUSEEVENTF_LEFTUP = 0x0004,

            /// <summary>
            ///     The right button was pressed.
            /// </summary>
            MOUSEEVENTF_RIGHTDOWN = 0x0008,

            /// <summary>
            ///     The right button was released.
            /// </summary>
            MOUSEEVENTF_RIGHTUP = 0x0010,

            /// <summary>
            ///     The middle button was pressed.
            /// </summary>
            MOUSEEVENTF_MIDDLEDOWN = 0x0020,

            /// <summary>
            ///     The middle button was released.
            /// </summary>
            MOUSEEVENTF_MIDDLEUP = 0x0040,

            /// <summary>
            ///     Maps coordinates to the entire desktop. Must be used with MOUSEEVENTF_ABSOLUTE.
            /// </summary>
            MOUSEEVENTF_VIRTUALDESK = 0x4000,

            /// <summary>
            ///     The wheel was moved, if the mouse has a wheel. The amount of movement is specified in mouseData.
            /// </summary>
            MOUSEEVENTF_WHEEL = 0x0800,

            /// <summary>
            ///     An X button was pressed.
            /// </summary>
            MOUSEEVENTF_XDOWN = 0x0080,

            /// <summary>
            ///     An X button was released.
            /// </summary>
            MOUSEEVENTF_XUP = 0x0100
        }

        [Flags]
        public enum KeyboardInputFlags
        {
            /// <summary>
            ///     If specified, the scan code was preceded by a prefix byte that has the value 0xE0 (224).
            /// </summary>
            KEYEVENTF_EXTENDEDKEY = 0x0001,

            /// <summary>
            ///     If specified, the key is being released. If not specified, the key is being pressed.
            /// </summary>
            KEYEVENTF_KEYUP = 0x0002,

            /// <summary>
            ///     If specified, wScan identifies the key and wVk is ignored.
            /// </summary>
            KEYEVENTF_SCANCODE = 0x0008,

            /// <summary>
            ///     If specified, the system synthesizes a VK_PACKET keystroke. The wVk parameter must be zero. This flag can only be
            ///     combined with the KEYEVENTF_KEYUP flag. For more information, see the Remarks section.
            /// </summary>
            KEYEVENTF_UNICODE = 0x0004
        }
        #endregion
    }
}
